#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "linkedlist.h"

int str_cmp(const void *a, const void *b);

void print_node(const void *data);


int main(int argc, char *argv[]) 
{
    listhead_t *list = NULL; // 一定要初始化为NULL，init函数会检查
    int ret, i;
    void *result = NULL;

    // 初始化链表
    ret = listhead_init(&list, sizeof(char **));
    if (ret != 0) {
        printf("链表初始化失败\n");
        return -1;
    }

    // 插入数据
    for (i = 1; i < argc; i++) {
        ret = list_insert(list, &argv[i]);
        if (ret != 0)
            printf("插入数据失败: %s\n", argv[i]);
        else
            printf("插入数据成功: %s\n", argv[i]);
    }

    // 遍历链表
    printf("链表内容: ");
    list_traval(list, print_node);

    // 查找数据
    result = list_find(list, &argv[2], str_cmp);
    if (result) 
        printf("找到了: %s\n", *((char **)result));
    else 
        printf("未找到: %s\n", argv[2]);

    // 删除数据
    ret = list_delete(list, &argv[2], str_cmp);
    if (ret == 0) 
        printf("删除成功: %s\n", argv[2]);
    else 
        printf("删除失败: %s\n", argv[2]);

    // 遍历链表
    printf("链表内容: ");
    list_traval(list, print_node);

    // 销毁链表
    list_destroy(&list);
    list = NULL;

    return 0;
}

// 比较函数：按字符串比较
int str_cmp(const void *a, const void *b) 
{
    return strcmp((const char *)a, (const char *)b);
}

// 打印函数：用于遍历时打印节点数据
void print_node(const void *data) 
{
    char **d = (char **)data;
    printf("%s ", *d);
}

